#include <ucontext.h>
#include <unistd.h>

#include <vector>
#include <functional>

//协程栈空间大小 8KB
#define DEFAULT_STACK_SIZE 1024*8

//协程任务类
typedef std::function<void()> Task;

//协程运行状态,FREE:执行完毕；RUNABLE：就绪；RUNNING：运行；SUSPEND：挂起

enum ThreadState {FREE, RUNNABLE,RUNNING, SUSPEND};

struct schedule_t;

struct uthread_t {
public:
	schedule_t * psche ;//协程所属的调度器
	ucontext_t ctx; //协程上下文数据结构
	Task task;//协程任务，包装用户的函数
	enum ThreadState state;
	char stack[DEFAULT_STACK_SIZE];//协程私有栈空间
	

};

//协程数组类别
typedef std::vector<uthread_t> UThread_vector;
// 协程调度器
struct schedule_t
{
private:
	ucontext_t mainctx; //main的上下文
	int running_thread; //正在运行的协程编号
	UThread_vector threads; //协程数组
public:
	schedule_t() : running_thread(-1){}
	~schedule_t() {}
	
	//创建协程
	int uthread_create(Task task);
	//挂起协程，切换到main
	void uthread_yield();
	//恢复编号id的协程
	void uthread_resume(int id);
	//判断所有协程是否执行完毕
	int schedule_finished() const;
	//协程函数入门
	static void uthread_func(void *arg);

}; 
